package com.txz.framework.utils.auth;

import com.alibaba.fastjson2.JSONObject;
import com.txz.common.exception.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

/**
 * 微信授权工具类（小程序登录专用）
 * 用于通过code获取openid、session_key等微信用户信息
 */
@Component
public class WxAuthUtil {
    private static final Logger log = LoggerFactory.getLogger(WxAuthUtil.class);

    /**
     * 微信小程序登录接口地址（固定）
     */
    private static final String WX_LOGIN_URL = "https://api.weixin.qq.com/sns/jscode2session";

    /**
     * 微信小程序appid（从配置文件读取，需在application.yml中配置）
     */
    @Value("${txz.mall.wx.miniapp.appid}")
    private String appid;

    /**
     * 微信小程序secret（从配置文件读取，需在application.yml中配置）
     */
    @Value("${txz.mall.wx.miniapp.secret}")
    private String secret;

    @Resource
    private RestTemplate restTemplate;

    /**
     * 通过微信code获取session_key和openid
     *
     * @param code 微信小程序登录时获取的临时code
     * @return 包含openid、session_key、unionid（可选）的Map
     * @throws ServiceException 当请求失败或返回错误时抛出
     */
    public Map<String, String> getWxSession(String code) {
        if (code == null || code.isEmpty()) {
            throw new ServiceException("微信code不能为空");
        }

        // 构建请求参数
        String url = String.format("%s?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
                WX_LOGIN_URL, appid, secret, code);

        try {
            // 调用微信接口
            String response = restTemplate.getForObject(url, String.class);
            log.info("微信code2session响应: {}", response);

            // 解析JSON响应
            JSONObject jsonObject = JSONObject.parseObject(response);

            // 微信返回错误时，抛出异常（如code无效、appid错误等）
            if (jsonObject.containsKey("errcode")) {
                int errCode = jsonObject.getIntValue("errcode");
                String errMsg = jsonObject.getString("errmsg");
                if (errCode != 0) {
                    throw new ServiceException("微信授权失败：" + errCode + "，" + errMsg);
                }
            }

            // 提取关键信息并返回
            Map<String, String> result = new HashMap<>(3);
            result.put("openid", jsonObject.getString("openid"));
            result.put("session_key", jsonObject.getString("session_key"));
            result.put("unionid", jsonObject.getString("unionid")); // 可选，需满足微信UnionID获取条件
            return result;
        } catch (Exception e) {
            log.error("微信code2session请求失败", e);
            throw new ServiceException("微信登录接口调用失败：" + e.getMessage());
        }
    }
}